package com.xywh.dakaqiandao.mvp.ui.activity;

import android.Manifest;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.alibaba.android.arouter.facade.annotation.Route;
import com.dds.soap.SoapListener;
import com.dds.soap.SoapParams;
import com.dds.soap.SoapUtil;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.jess.arms.base.BaseActivity;
import com.jess.arms.base.BaseConstants;
import com.jess.arms.di.component.AppComponent;
import com.jess.arms.utils.ArmsUtils;
import com.jess.arms.utils.DeviceUtils;
import com.vector.update_app.UpdateAppBean;
import com.vector.update_app.UpdateAppManager;
import com.vector.update_app.UpdateCallback;
import com.vector.update_app.listener.ExceptionHandler;
import com.vector.update_app.listener.IUpdateDialogFragmentListener;
import com.vector.update_app.utils.AppUpdateUtils;
import com.xywh.dakaqiandao.R;
import com.xywh.dakaqiandao.di.component.DaggerLoginComponent;
import com.xywh.dakaqiandao.di.module.LoginModule;
import com.xywh.dakaqiandao.mvp.contract.LoginContract;
import com.xywh.dakaqiandao.mvp.presenter.LoginPresenter;
import com.xywh.dakaqiandao.mvp.ui.entity.Login;
import com.xywh.dakaqiandao.mvp.ui.entity.UpdateMyAppBean;
import com.xywh.dakaqiandao.mvp.ui.util.GpsUtil;

import org.json.JSONException;
import org.json.JSONObject;
import org.ksoap2.SoapFault;
import org.ksoap2.serialization.SoapObject;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import butterknife.BindView;
import butterknife.OnClick;
import me.jessyan.armscomponent.commonres.utils.CProgressDialogUtils;
import me.jessyan.armscomponent.commonres.utils.ToolbarUtils;
import me.jessyan.armscomponent.commonres.utils.UpdateAppHttpUtil;
import me.jessyan.armscomponent.commonsdk.core.RouterHub;
import me.jessyan.armscomponent.commonsdk.utils.Utils;
import pub.devrel.easypermissions.EasyPermissions;

import static com.jess.arms.base.BaseConstants.BASE_URL;
import static com.jess.arms.base.BaseConstants.NAME_SPACE;
import static com.jess.arms.utils.Preconditions.checkNotNull;
import static com.xywh.dakaqiandao.mvp.ui.util.GpsUtil.GPS_REQUEST_CODE;


@Route(path = RouterHub.ACTIVITY_LOGIN)
public class LoginActivity extends BaseActivity<LoginPresenter> implements LoginContract.View, EasyPermissions.PermissionCallbacks {


    @BindView(R.id.title)
    TextView title;
    @BindView(R.id.btnRight)
    ImageView btnRight;
    @BindView(R.id.toolbar)
    Toolbar toolbar;
    @BindView(R.id.img_head)
    ImageView imgHead;
    @BindView(R.id.login_edit_account)
    EditText loginEditAccount;
    @BindView(R.id.login_edit_pwd)
    EditText loginEditPwd;
    @BindView(R.id.cb_jzmm)
    CheckBox cbJzmm;
    @BindView(R.id.login_btn_login)
    Button loginBtnLogin;
    @BindView(R.id.tv_zhao_hui_mi_ma)
    TextView tvZhaoHuiMiMa;
    @BindView(R.id.tv_register)
    TextView tvRegister;
    @BindView(R.id.tv_version)
    TextView tvVersion;
    @BindView(R.id.tv_shang_chuan_jing_wei_du)
    TextView mTvShangChuanJingWeiDu;
    private String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.ACCESS_COARSE_LOCATION};
    private String[] permissionsLocation = {Manifest.permission.ACCESS_COARSE_LOCATION};

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == GPS_REQUEST_CODE) {
//            openGPSSEtting();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);

        if (requestCode == 104) {

        }
    }

    @Override
    public void onPermissionsGranted(int requestCode, @NonNull List<String> perms) {
        ArmsUtils.makeText(this, "相关权限获取成功");
    }

    @Override
    public void onPermissionsDenied(int requestCode, @NonNull List<String> perms) {
        ArmsUtils.makeText(this, "请同意相关权限，否则功能无法使用");
    }

    @Override
    public void setupActivityComponent(@NonNull AppComponent appComponent) {
        DaggerLoginComponent //如找不到该类,请编译一下项目
                .builder()
                .appComponent(appComponent)
                .loginModule(new LoginModule(this))
                .build()
                .inject(this);
    }

    @Override
    public int initView(@Nullable Bundle savedInstanceState) {
        return R.layout.activity_login; //如果你不需要框架帮你设置 setContentView(id) 需要自行设置,请返回 0
    }

    @Override
    public void initData(@Nullable Bundle savedInstanceState) {

        ToolbarUtils.initToolbarTitleNoBack(this, getString(R.string.activity_login));
//        getLoginData();

        if (!TextUtils.isEmpty(mSharedPreferencesHelper.getString(BaseConstants.USERNAME))) {
            loginEditAccount.setText(mSharedPreferencesHelper.getString(BaseConstants.USERNAME));
        }
        if (!TextUtils.isEmpty(mSharedPreferencesHelper.getString(BaseConstants.PASSWORD))) {
            loginEditPwd.setText(mSharedPreferencesHelper.getString(BaseConstants.PASSWORD));
        }

        tvVersion.setText(DeviceUtils.getVersionName(this));

        updateDiy();
//        canChange();
    }

    public void updateDiy() {

//        String path = Environment.getExternalStorageDirectory().getAbsolutePath();

        Map<String, String> params = new HashMap<String, String>();

        params.put("appKey", "ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f");
        params.put("appVersion", AppUpdateUtils.getVersionName(this));
        params.put("key1", "value2");
        params.put("key2", "value3");


        new UpdateAppManager
                .Builder()
                //必须设置，当前Activity
                .setActivity(this)
                //必须设置，实现httpManager接口的对象
                .setHttpManager(new UpdateAppHttpUtil())
                //必须设置，更新地址
                .setUpdateUrl(BASE_URL + "/GetCurrentversion")
                //全局异常捕获
                .handleException(new ExceptionHandler() {
                    @Override
                    public void onException(Exception e) {
                        e.printStackTrace();
                    }
                })
                //以下设置，都是可选
                //设置请求方式，默认get
                .setPost(true)
                //不显示通知栏进度条
//                .dismissNotificationProgress()
                //是否忽略版本
//                .showIgnoreVersion()
                //添加自定义参数，默认version=1.0.0（app的versionName）；apkKey=唯一表示（在AndroidManifest.xml配置）
                .setParams(params)
                //设置点击升级后，消失对话框，默认点击升级后，对话框显示下载进度，如果是强制更新，则设置无效
//                .hideDialogOnDownloading()
                //设置头部，不设置显示默认的图片，设置图片后自动识别主色调，然后为按钮，进度条设置颜色
                .setTopPic(R.drawable.top_8)
                //为按钮，进度条设置颜色。
                .setThemeColor(0xffffac5d)
                //设置apk下砸路径，默认是在下载到sd卡下/Download/1.0.0/test.apk
//                .setTargetPath(path)
                //设置appKey，默认从AndroidManifest.xml获取，如果，使用自定义参数，则此项无效
//                .setAppKey("ab55ce55Ac4bcP408cPb8c1Aaeac179c5f6f")
                .setUpdateDialogFragmentListener(new IUpdateDialogFragmentListener() {
                    @Override
                    public void onUpdateNotifyDialogCancel(UpdateAppBean updateApp) {
                        //用户点击关闭按钮，取消了更新，如果是下载完，用户取消了安装，则可以在 onActivityResult 监听到。

                    }
                })
                //不自动，获取
//                .setIgnoreDefParams(true)
                .build()
                //检测是否有新版本
                .checkNewApp(new UpdateCallback() {
                    /**
                     * 解析json,自定义协议
                     *
                     * @param json 服务器返回的json
                     * @return UpdateAppBean
                     */
                    @Override
                    protected UpdateAppBean parseJson(String json) {
                        UpdateMyAppBean updateAppBean = new UpdateMyAppBean();
                        try {
                            String result = json.substring(75, json.toCharArray().length - 9);
                            if (result.equals("[]")) {
                            } else {
                                JSONObject jsonObject = new JSONObject(result);
                                String code = jsonObject.optString("code");

                                if (Integer.parseInt(code) > DeviceUtils.getVersionCode(LoginActivity.this)) {


                                    final String newVersion = jsonObject.optString("new_version");
                                    updateAppBean
                                            //（必须）是否更新Yes,No
//                                            .setUpdate(jsonObject.optString("update"))
                                            .setUpdate("Yes")
                                            //（必须）新版本号，
                                            .setNewVersion(newVersion)
                                            //（必须）下载地址
                                            .setApkFileUrl(jsonObject.optString("apk_file_url"))
                                            //测试下载路径是重定向路径
//                                    .setApkFileUrl("http://openbox.mobilem.360.cn/index/d/sid/3282847")
//                                    .setUpdateDefDialogTitle(String.format("AppUpdate 是否升级到%s版本？", newVersion))
                                            //（必须）更新内容
                                            .setUpdateLog(jsonObject.optString("update_log"))
                                            //测试内容过度
//                                    .setUpdateLog("测试")
//                                    .setUpdateLog("1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16")
//                                            .setUpdateLog("今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说相对于其他行业来说今天我们来聊一聊程序员枯燥的编程生活，相对于其他行业来说\r\n")
                                            //大小，不设置不显示大小，可以不设置
                                            .setTargetSize(jsonObject.optString("target_size"))
                                            //是否强制更新，可以不设置
                                            .setConstraint(true)
                                            //设置md5，可以不设置
                                            .setNewMd5(jsonObject.optString("new_md5"));
                                } else {
//                                    ArmsUtils.makeText(LoginActivity.this, "没有新版本");
                                }
                            }


                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        return updateAppBean;
                    }

                    @Override
                    protected void hasNewApp(UpdateAppBean updateApp, UpdateAppManager updateAppManager) {
                        updateAppManager.showDialogFragment();
                    }

                    /**
                     * 网路请求之后
                     */
                    @Override
                    public void onAfter() {
                        CProgressDialogUtils.cancelProgressDialog(LoginActivity.this);
                    }

                    /**
                     * 没有新版本
                     */
                    @Override
                    public void noNewApp(String error) {
                        Toast.makeText(LoginActivity.this, "没有新版本", Toast.LENGTH_SHORT).show();
                    }

                    /**
                     * 网络请求之前
                     */
                    @Override
                    public void onBefore() {
                        CProgressDialogUtils.showProgressDialog(LoginActivity.this);
                    }
                });

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    /**
     * //地区经纬度设置是否可用(0:不可用 1:可用)
     */
    private void canChange() {

        showLoading();

        String methodName = "canChange";

        SoapUtil soapUtil = SoapUtil.getInstance(this);
        soapUtil.setDotNet(true);
        SoapParams params = new SoapParams();


        /**
         * 请求
         */
        soapUtil.call(BASE_URL, NAME_SPACE, methodName, params, new SoapListener() {
            @Override
            public void onSuccess(int statusCode, SoapObject object) {
                hideLoading();

                String result = object.getProperty("canChangeResult").toString();
                if (result != null && result.equals("1")) {
                    mTvShangChuanJingWeiDu.setVisibility(View.VISIBLE);
                } else {
                    mTvShangChuanJingWeiDu.setVisibility(View.GONE);
                }
            }

            @Override
            public void onFailure(int statusCode, String content, Throwable error) {
                hideLoading();
            }

            @Override
            public void onFailure(int statusCode, SoapFault fault) {
                hideLoading();
            }
        });


    }

    @Override
    public void showLoading() {
        CProgressDialogUtils.showProgressDialog(this);
    }

    @Override
    public void hideLoading() {
        CProgressDialogUtils.cancelProgressDialog(this);

    }

    @Override
    public void showMessage(@NonNull String message) {
        checkNotNull(message);
        ArmsUtils.snackbarText(message);
    }

    @Override
    public void launchActivity(@NonNull Intent intent) {
        checkNotNull(intent);
        ArmsUtils.startActivity(intent);
    }

    @Override
    public void killMyself() {
        finish();
    }

    private void getLoginData() {
        HashMap<String, String> map = new HashMap<>();

        mPresenter.getLoginData(map);
    }

    @Override
    public void getLoginDataSuccess(Login entityData) {


    }

    @OnClick({R.id.login_btn_login, R.id.tv_zhao_hui_mi_ma, R.id.tv_register, R.id.tv_shang_chuan_jing_wei_du, R.id.login_set})
    public void onViewClicked(View view) {
//        if (getLocationPermission() && getPermission()) {
        if (getPermission()) {
            switch (view.getId()) {
                case R.id.login_btn_login:
                    if (GpsUtil.checkGpsIsOpen(this)) {
                        doLogin();
                    }
//                Utils.navigation(this, RouterHub.ACTIVITY_QIAN_DAO);

                    break;
                case R.id.tv_zhao_hui_mi_ma:
                    toWangJiMiMa();
                    break;
                case R.id.tv_register:
                    toRegisterActivity();
                    break;
                case R.id.tv_shang_chuan_jing_wei_du:
                    Utils.navigation(this, RouterHub.ACTIVITY_SOU_JI_JING_WEI_DU);
                    break;
                case R.id.login_set:
                    Utils.navigation(this, RouterHub.ACTIVITY_FORGOT_PASSWORD);
                    break;
            }
        }

    }

    private boolean getPermission() {
        if (EasyPermissions.hasPermissions(this, permissions)) {
            return true;
        } else {
//            EasyPermissions.requestPermissions(this, "需要获取您的相册、照相使用权限", 1, permissions);
            EasyPermissions.requestPermissions(this, "需要获取您的使用权限", 1, permissions);
            return false;
        }

    }


    private void doLogin() {
//        showLoading();

        if (ArmsUtils.isNetworkAvailable(this)) {

            if (TextUtils.isEmpty(getUsername())) {
                ArmsUtils.makeText(getContext(), getString(R.string.hint_shou_Ji_hao));
                return;
            }
            if (TextUtils.isEmpty(getPassword())) {
                ArmsUtils.makeText(getContext(), getString(R.string.hint_mi_ma));
                return;
            }

//        mPresenter.login(getUsername(), getPassword());
            employeeExistsCheck();
        } else {
            ArmsUtils.makeText(this, "当前网络不可用");
            return;
        }
    }


    private void toWangJiMiMa() {
//        Utils.navigation(this, RouterHub.SELLER_CLIENT_REDENVELOPESACTIVITY);

    }

    private void toRegisterActivity() {
        Utils.navigation(this, RouterHub.ACTIVITY_REGISTER);
    }

    @NonNull
    private String getUsername() {
        return loginEditAccount.getText().toString().trim();
    }

    @NonNull
    private String getPassword() {
        return loginEditPwd.getText().toString().trim();
    }

    /**
     * employeeExistsCheck(string identityCardNo, string employeePassword)
     */
    private void employeeExistsCheck() {

        showLoading();

//        String methodName = "employeeExistsCheck";
        String methodName = "employeeExistsCheckValidate";

        SoapUtil soapUtil = SoapUtil.getInstance(this);
        soapUtil.setDotNet(true);
        SoapParams params = new SoapParams();
        params.put("identityCardNo", getUsername());
        params.put("employeePassword", getPassword());


        /**
         * 请求
         */
        soapUtil.call(BASE_URL, NAME_SPACE, methodName, params, new SoapListener() {
            @Override
            public void onSuccess(int statusCode, SoapObject object) {
                hideLoading();

                String result = object.getProperty("employeeExistsCheckValidateResult").toString();
                if (!TextUtils.isEmpty(result)) {
                    // 使用new方法
                    Gson gson = new Gson();
                    // fromJson 将json字符串转为bean对象
                    Login login = null;
                    try {
                        login = gson.fromJson(result, Login.class);
                    } catch (JsonSyntaxException e) {
                        e.printStackTrace();
                        ArmsUtils.makeText(getContext(), "登录异常，请联系开发人员");
                        return;
                    }
                    if (login.isExistFlag().equals("true")) {
                        ArmsUtils.makeText(getContext(), "登录成功");
//                    mSharedPreferencesHelper.putString(BaseConstants.TOKEN, login.getData().getAccess_token());
//                    mSharedPreferencesHelper.putString(BaseConstants.UID, login.getData().getUseId());
                        mSharedPreferencesHelper.putString(BaseConstants.USERNAME, getUsername());
                        mSharedPreferencesHelper.putString(BaseConstants.NICKNAME, login.getEmployeeName());
//                    mSharedPreferencesHelper.putString(BaseConstants.NICK_NAME, login.getData().getNick_name());
                        mSharedPreferencesHelper.putString(BaseConstants.PASSWORD, getPassword());
                        mSharedPreferencesHelper.putString(BaseConstants.API_USER_NAME, login.getApiUserName());
                        mSharedPreferencesHelper.putString(BaseConstants.API_PWD, login.getApiPwd());
                        String is_set = mSharedPreferencesHelper.getString(BaseConstants.IS_SET);
                        if (!TextUtils.isEmpty(is_set) && is_set.equals("1")) {
                            Utils.navigation(LoginActivity.this, RouterHub.ACTIVITY_QIAN_DAO);
                        } else {
                            Utils.navigation(LoginActivity.this, RouterHub.ACTIVITY_DI_QU_SHE_ZHI);
                        }

//                    killMyself();；/
                    } else {
                        ArmsUtils.makeText(getContext(), "用户名或密码错误");
                    }
                }
            }


            @Override
            public void onFailure(int statusCode, String content, Throwable error) {
                hideLoading();
            }

            @Override
            public void onFailure(int statusCode, SoapFault fault) {
                hideLoading();
            }
        });


    }

    private boolean getLocationPermission() {
        if (EasyPermissions.hasPermissions(this, permissionsLocation)) {

            return true;
        } else {

            EasyPermissions.requestPermissions(this, "需要获取定位权限", 104, permissionsLocation);
            return false;
        }

    }

}
